package com.droowa.controller;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView;

import com.droowa.domain.BoardClass;
import com.droowa.domain.BoardList;
import com.droowa.domain.BoardManagement;
import com.droowa.domain.BoardOrder;
import com.droowa.domain.BoardPaper;
import com.droowa.domain.BoardSort;
import com.droowa.model.service.BoardManagementService;
import com.droowa.model.service.BoardPaperService;

@Controller
@RequestMapping("/board/")
public class BoardController {

	@Autowired
	BoardManagementService managementService;
	@Autowired
	BoardPaperService paperService;
	
	//게시판목록
	@RequestMapping(value="boardManagement.do")
	public String boardManagement(Model map) throws SQLException {
		List<BoardList> blList = managementService.searchBoardList();
		map.addAttribute("boardList", blList);
		return "admin.board/board_management";
	}
	
	//게시판 설정
	@RequestMapping(value="boardSetting.do")
	public String boardSetting(int bid, Model map) throws SQLException {
		System.out.println("게시판 세팅 : " + bid);
		BoardManagement bm;
		//신규 게시판 등록
		if(bid == 0) {
			System.out.println("신규 게시판 등록");
			bm = new BoardManagement(0, "제목없음", 1, 15, 10, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 24, 0, 1, 3, 1, 2, 1, 1, 0, 10, 10, 1, 0, 1, 0, 1, 0);
		} else {	//기존 게시판 설정 변경
			System.out.println("기존 게시판 수정");
			bm = managementService.searchBoardManagementId(bid);
		}
		List<BoardClass> bcList = managementService.searchBoardClass();
		map.addAttribute("boardClass", bcList);
		map.addAttribute("boardManagement", bm);
		//System.out.println("length : " + bcList.size());
		/*for(BoardClass test:bcList) {
			System.out.println(test.getClassName());
			//System.out.println(test.getClassId() + " : " + test.getClassName());
		}*/
		return "/no-tiles/board_setting.jsp";
	}
	
	//게시판 설정 저장
	@RequestMapping(value="boardSave.do")
	public String boardSave(int bid, BoardManagement bm, Model map) throws SQLException {
		System.out.println("게시판 설정 저장 : " + bid);
		//신규게시판 등록
		if(bid == 0) {
			System.out.println("신규 게시판 설정 저장");
			
			//게시판 설정 행 추가
			managementService.insertBoardManagement(bm);
			//게시물 테이블 생성
			bid = bm.getBoardId();
			managementService.createBoardPaper(bid);
			managementService.createBoardPaperSequence(bid);
			
			
			/*//게시판 순서지정
			BoardOrder bo = new BoardOrder(bm.getBoardId());
			try {
				service.insertBoardOrder(bo);
			} catch(IllegalArgumentException e) {
				bo = new BoardOrder(bm.getBoardId(), 1); 
				service.insertBoardFirstOrder(bo);
			}*/			
		} else {
			System.out.println("기존 게시판 설정 저장");
			bm.setBoardId(bid);
			managementService.updateBoardManagementById(bm);
		}
		return boardSetting(bid, map);
	}
	
	//게시판 삭제
	@RequestMapping(value="boardDelete.do")
	public String boardDelete(int[] board_check, Model map) throws SQLException {
		System.out.print("게시판 삭제 : ");
		for(int boardId : board_check) {
			managementService.deleteBoardManagementById(boardId);
			managementService.dropBoardPaper(boardId);
			managementService.dropBoardPaperSequence(boardId);
			System.out.print(boardId); 
		}
		//return boardManagement(map);	//dispatcher 방식 : 새로고침시 이미 지워진 값을 다시 지우려하기에 오류발생 
		return "redirect:boardManagement.do";	//redirect 방식
	}
	
	//게시판 이동
	@RequestMapping(value="list.do")
	public String boardPaper(@RequestParam(defaultValue="1")String page, int bid, ModelMap model) throws Exception {
		//Business Logic 호출 -> model
		//page=  로 넘어온 경우(위 @RequestParam 설정은 page 요청파라미터 이름으로 넘어온 것이 없는 경우이다.
		int pageNo = 1;
		try{
			pageNo = Integer.parseInt(page);
		}catch(Exception e){}
		Map map = paperService.getBoardPaperList(bid, pageNo);
		model.addAllAttributes(map);

		return "customer.board_paper";
	}
	
	//게시물 작성폼 이동
	@RequestMapping(value="writeForm.do")
	public String boardWriteForm(int bid, ModelMap model) throws Exception {
		model.addAttribute("boardId", bid);
		return "customer.paper_write_form";
	}
	
	//게시물 저장 이동
	@RequestMapping(value="writeContent.do")
	public ModelAndView boardWriteContent(int bid, BoardPaper paper) throws Exception {
		//임시 테이블
		tempPaper(paper);
		
		paperService.writeContent(bid, paper);
		
		//ModelAndView mv = null;
		//mv = new ModelAndView("redirect:getContent.do?boardId="+board_id+"&num="+paper.getPaperNum());
		
		return new ModelAndView("redirect:getContent.do?bid="+bid+"&num="+paper.getPaperNum());
	}
	
	/**
	 * 한개의 글(게시물)을 조회하는 handler 메소드
	 * 
	 * @param no int - 조회하고자 하는 글번호
	 * @param map ModelMap - 조회한 글 데이터를 저장할 ModelMap
	 * @return String - show_content.jsp 로 이동
	 */
	@RequestMapping(value="getContent.do")
	public String getContent(int bid, int num, ModelMap map){
		String url = null;
		try{
			//2. Business Logic 요청 - Model
			System.out.println("bid : " + bid + " / num : " + num);
			BoardPaper paper = paperService.getContentByNO(bid, num);
			map.addAttribute("paper", paper);
			url = "customer.paper_show_content"; 
		}catch(Exception e){
			e.printStackTrace();
			map.addAttribute("error_message", "글 조회도중 오류 발생 : "+e.getMessage());
			url = "error";
		}	
		return url;
	}
	
	/**
	 * 수정폼 으로 이동을 처리하는 handler 메소드
	 * @param no : int - 수정할 글 번호. 이 번호의 글을 조회해서 응답처리한다.
	 * @param map : 수정할 글 데이터를 View에 전송하기 위한 ModelMap
	 * @return String :  정상흐름 - redirect 방식으로 getContent.do , 예외흐름 - error.jsp 로 이동
	 */
	@RequestMapping("modifyForm.do")
	public String modifyForm(int bid, int num, ModelMap map){
		String url = null;
		try{
			//2. B.L 처리
			BoardPaper paper = paperService.getContentByNoForForm(bid, num);
			url = "customer.paper_modify_form";
			map.addAttribute("paper", paper);
		}catch(Exception e){
			e.printStackTrace();
			url = "error";
			map.addAttribute("error_message", "수정할 글 조회도중 오류발생 : "+e.getMessage());
		}
		return url;
	}
	
	/**
	 * 클라이언트가 수정한 글을 처리하기 위한 Handler 메소드
	 * 
	 * @param qnaBoard : QnABoard -  client가 전송한 게시물 수정 정보 - no, writer, title, content, viewcount, page번호 가 요청파라미터로 전송됨
	 * @return ModelAndView : 정상
	 */
	@RequestMapping("modifyContent.do")
	public ModelAndView modifyContent(BoardPaper paper, int page) {
		ModelAndView mv = null;
		try {			
			//2. B.L 요청			
			String boardId = paper.getBoardId();	//doa 작업중 boardId가 변경되기에 값을 미리 저장해 둔다.
			paperService.modifyContent(paper);
			mv = new ModelAndView("redirect:getContent.do?bid="+boardId+"&num="+paper.getPaperNum()+"&page="+page);
		} catch (Exception e) {
			e.printStackTrace();
			mv = new ModelAndView("error","error_message", "수정처리중 오류 발생 : "+e.getMessage());
		}
		return mv;
	}
	
	/**
	 * 글 삭제 처리 handler 메소드
	 * @param no : int - 삭제할 글 번호
	 * @return String - 정상흐름 : list.do (목록으로 이동), 예외흐름 : error.jsp
	 */
	@RequestMapping("deleteContent.do")
	public String deleteContent(int bid, int num, int page, ModelMap map){
		String url = null;
		try {
			//2. BL
			paperService.deleteContentByNO(bid, num);
			url = "redirect:list.do?bid="+bid+"&page="+page;
		}catch (Exception e) {
			e.printStackTrace();
			url = "error";
			map.addAttribute("error_message", "삭제도중 오류 발생 : "+e.getMessage());
		}
		return url;
	}
	
	/**
	 * 답변 입력 폼 으로 이동을 처리하는 handler 메소드
	 * @param no : int - 답변하고자 하는 원본글의 번호. 답변 폼으로 원본글의 데이터를 보낸다.
	 * @return
	 */
	@RequestMapping("replyForm.do")
	public String replyForm(int bid, int num, ModelMap map) throws SQLException {
		//1. 요청 파라미터 조회 - no
		BoardPaper paper = paperService.getContentByNoForForm(bid, num);
		map.addAttribute("paper", paper);
		return "customer.paper_reply_form";
	}
	/**
	 * 클라이언트가 전송한 답변 글을 등록하는 handler 메소드
	 * @param qnaBoard : QnABoard - client가 전송한 답변 게시물 정보 - writer, title, content, refamily, restep, relevel, page번호 가 요청파라미터로 전송됨
	 * @param page : 원본글이 위치했던 page (처리후 목록 페이지 이동시 원본글이 있던 페이지로 이동하기 위해)
	 * @return ModelAndView - 정상흐름 - redirect 방식으로 getContent.do , 예외흐름 - error.jsp 로 이동
	 */
	@RequestMapping("replyContent.do")
	public ModelAndView replyContent(BoardPaper paper,  @RequestParam(required=false, defaultValue="1") String page) throws SQLException{
		String boardId = paper.getBoardId();	//doa 작업중 boardId가 변경되기에 값을 미리 저장해 둔다.
		ModelAndView mv = null;
		if(page.equals("")){
			page="1";
		}
		paperService.replyContent(paper);
		//멱등처리
		mv = new ModelAndView("redirect:getContent.do?bid="+boardId+"&num="+paper.getPaperNum()+"&page="+page);
		return mv;
	}
	
	//게시판 순서 변경폼 불러오기
	@RequestMapping(value="boardSort.do")
	public String boardSort(Model map) throws SQLException {
		System.out.println("게시판 순서 변경폼 로딩");
		List<BoardSort> sortList = managementService.searchSortList();
		map.addAttribute("sortList", sortList);
		return "/no-tiles/board_sort.jsp";
	}
	
	//게시판 순서 변경
	@RequestMapping(value="boardSortSave.do")
	public String boardSortSave(int sort[], Model map) throws SQLException {
		System.out.println("게시판 순서 변경");
		managementService.updateBoardSort(sort);
		return "redirect:boardSort.do";
	}
	
	//BoardPaper domain 임시값 부여
	private void tempPaper(BoardPaper paper) {
		paper.setPartitionId(0);
		paper.setNotice(0);
		paper.setPcId(null);
		paper.setFileAdd(null);
		paper.setImage(null);
		paper.setSecret(0);
		paper.setPassword(null);
		paper.setEmail(null);
		paper.setManagerId(null);
	}
}
